完成了第一週的工具建置與 Prompt 工程技巧後,從今天開始,我們將進入工程師最常面臨的實戰場景之一:演算法解題(LeetCode)。
很多工程師在刷題時使用 AI 的方式往往是:「把題目整段複製 ➔ 貼給 ChatGPT ➔ 叫它給出最優解 ➔ 複製貼回 LeetCode」。這種做法雖然能快速拿到綠色 AC(Accepted),但遇到稍微變形的面試題時,依然無法獨立思考。
更高效的人機協同刷題方式,是把 AI 當作**「演算法教練」**:不讓它直接爆出解答,而是引導它先幫我們梳理題目脈絡、列出邊界條件,釐清解題思維。
在開始動筆寫代碼前,先要求 AI 只做「需求分析」,禁止直接產出最終解答代碼。
你可以使用以下提示詞結構:
【破題提示詞範本】
請擔任資深演算法面試官。我正在練習以下題目:
[貼上題目內容]請先不要直接提供完整代碼,請依序回答以下三點:
- 關鍵約束提煉:這題的核心輸入範圍、特殊限制是什麼?
- 隱藏邊界條件(Edge Cases):有哪些極端情境(如長度為 0 或 1、負數、極值溢位)容易出錯?
- 思維漸進路徑:從直覺的暴力解法(Brute Force)出發,有什麼瓶頸?可以用什麼資料結構優化?
我們以所有工程師的第一道題目 Two Sum 為例:
給定一個整數陣列
nums和一個目標值target,請找出陣列中「和為目標值」的那兩個整數,並回傳它們的陣列下標。
當我們送出上述提示詞後,AI 會給出極具價值的分析:
nums = [3, 2, 4], target = 6,不能挑選兩次下標 0 的 3)。target = -8,nums = [-3, -5])。nums = [3, 3], target = 6,這意味著如果用 Hash Table 存 Key,必須注意覆蓋問題)。當邊界條件與空間換時間的思路清晰後,我們再請 AI 依照這個思維產出 Java 解法,代碼邏輯就非常容易理解與吸收:
‵‵‵
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int[] twoSum(int[] nums, int target) {
// 使用 HashMap 記錄:Key = 數值, Value = 該數值對應的陣列索引
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
// 邊界檢查:如果先前已經看過這個差值,代表找到配對
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
// 將當前數字與索引存入 Map,邊走邊查同時避免自己與自己配對
map.put(nums[i], i);
}
// 題目保證有解,若無解則回傳空陣列防呆
return new int[] {};
}
}
‵‵‵
四、工程師的實踐反思
透過這種「先分析邊界、再看代碼」的模式,有兩個明顯收穫:
避免 Hash Table Key 覆蓋的陷阱:
如果我們在一開始就把所有元素放進 map,遇到 [3, 3] 這種重複元素時,第二個 3 的下標會覆蓋第一個 3。而 AI 分析指出的「One-pass(單次遍歷邊查邊存)」策略,剛好在存入前先查到了前一個 3,完美化解覆蓋問題。
理解時空權衡(Time-Space Tradeoff):
時間複雜度由 O(n²) 大幅優化為 O(n),代價是額外消耗了 O(n) 的空間複雜度存儲 HashMap。
今日小結與預告
今天我們打破了「直接向 AI 索取 LeetCode 答案」的無效刷題法,建立了以「約束提煉 ➔ 邊界挖掘 ➔ 資料結構優化」為核心的破題流程。
明天的 Day 07,我們將聚焦於演算法面試最核心的指標:「【複雜度分析】向 AI 請教:如何評估演算法的時間複雜度(Big-O)與空間複雜度?」,教大家如何讓 AI 成為你的計算機演算法助教!